package com.panfeng.xcloud.gateway.reptile;

import com.panfeng.xcloud.common.core.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;

/**
 * 反爬虫验证验证者
 *
 * @author xiaobo
 * @version 1.0
 * @since 2019-05-21
 */
@Slf4j
public class Checker {

    private static List<AntiCrawlerRule> ruleStrategys = new ArrayList<>();

    public static void addRuleStrategy(AntiCrawlerRule r){
        ruleStrategys.add(r);
    }

    /**
     * 开始检查反爬虫规则
     *
     * @param checkContent
     * @param toBeCheckContent
     * @return
     */
    public static boolean doCheck(String checkContent,String toBeCheckContent){
        if(ruleStrategys.size() <= 0){
            log.info(">>> 当前反爬虫规则集合为空，请添加验证规则，并返回验证失败 <<<");
            return false;
        }
        //只要有一种规则验证失败则认定整个验证是失败的
        for (AntiCrawlerRule r:ruleStrategys) {
            if (!r.antiCheck(checkContent,toBeCheckContent)){
                log.info(">>> 当前反爬虫规则不通过 <<<");
                return false;
            }
        }
        log.info(">>> 当前反爬虫规则通过 <<<");
        return true;
    }

    /**
     * 开始检查反爬虫规则
     *
     * @param checkContent
     * @return
     */
    public static boolean doCheck(String checkContent){
        if(ruleStrategys.size() <= 0){
            log.info(">>> 当前反爬虫规则集合为空，请添加验证规则，并返回验证失败 <<<");
            return false;
        }
        //只要有一种规则验证失败则认定整个验证是失败的
        for (AntiCrawlerRule r:ruleStrategys) {
            if (!r.antiCheck(checkContent)){
                log.info(">>> 当前反爬虫规则不通过 <<<");
                return false;
            }
        }
        log.info(">>> 当前反爬虫规则通过 <<<");
        return true;
    }

    /**
     * 开始检查反爬虫规则
     *
     * @param request
     * @return
     */
    public static boolean doCheck(HttpServletRequest request){
        //开始进行反爬虫验证
        /** 其中 antiKey 的内容格式是： clientSecret：timestamp(精确的毫秒) **/
        String antiKey = request.getHeader("antiKey");
        if(StringUtils.isEmpty(antiKey)){
            log.info(">>> header中无法获取antiKey，从queryString中获取 <<<");
            antiKey = request.getParameter("antiKey");
        }
        String requestURI = request.getRequestURI();
        log.info(">>> 反爬虫拦截==> 请求接口url:{}，antiKey:{} <<<" ,requestURI ,antiKey);
        return doCheck(antiKey);
    }
}
